//图的m着色问题
#include <iostream>
#include <vector>
#include <cstring>

using namespace std;
const int MAXN=100;
const int MAXM=10;
vector<int> G[MAXN+1];
int n,k,m;
int color[MAXN+1];
int total=0;
void search(int u){
    if (u>n) total++;
    else {
        bool flag[m+1];
        memset(flag,false,sizeof(flag));
        int s=G[u].size();
        for(int k=0;k<s;k++){
            int v=G[u][k];
            if (v<u) flag[color[v]]=true;//只检查在u之前的与之相邻的点，
                                         //在u之后的点在安排u的时候应看作没有安排颜色，这样在上一轮搜索回溯回来的时候不需要恢复数据
        }
        for(int c=1;c<=m;c++){
            if (!flag[c]){
                color[u]=c;
                search(u+1);
            }
        }
    }
}
int main()
{
    cin>>n>>k>>m;
    for(int i=1;i<=k;i++){
        int u,v;
        cin>>u>>v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    search(1);
    cout<<total;
} 
